import pandas as pd
import akshare as ak
import datetime
import pandas as pd

 # 获取 市盈率大于2 小于5的 沪深300 的股票

# 1. 获取沪深300指数成分股
print("正在获取沪深300指数成分股...")
sh_index_stocks = ak.index_stock_cons(symbol="000300")  # 000300是沪深300指数代码
print(f"获取到 {len(sh_index_stocks)} 只成分股")

# 查看返回数据的列名
print("沪深300成分股数据列名:", sh_index_stocks.columns.tolist())
print("前5行数据:")
print(sh_index_stocks.head())

# 2. 获取所有A股实时行情数据
print("正在获取所有A股实时行情数据...")
all_stock_data = ak.stock_zh_a_spot_em()
print("A股行情数据列名:", all_stock_data.columns.tolist())

# 3. 筛选出沪深300成分股的行情数据
# 动态确定股票代码列名
stock_code_column = None
for col in ['code', '股票代码', 'symbol']:
    if col in sh_index_stocks.columns:
        stock_code_column = col
        break

if stock_code_column is None:
    print("错误: 无法找到股票代码列")
    # 使用第一列作为股票代码列
    stock_code_column = sh_index_stocks.columns[0]
    print(f"警告: 尝试使用列 '{stock_code_column}' 作为股票代码列")

# 确保股票代码格式一致（去除市场标识）
sh_index_stocks['code'] = sh_index_stocks[stock_code_column].astype(str).str.strip()
all_stock_data['code'] = all_stock_data['代码'].astype(str).str.strip()

# 合并数据
print("正在筛选沪深300成分股行情数据...")
hs300 = pd.merge(sh_index_stocks, all_stock_data, on='code', how='inner')

# 4. 筛选市盈率大于2小于5的股票
print("正在筛选市盈率大于2小于5的股票...")
# 确保'市盈率-动态'列存在
if '市盈率-动态' in hs300.columns:
    hs300 = hs300[hs300['市盈率-动态'] > 2]
    hs300 = hs300[hs300['市盈率-动态'] < 5]
else:
    print("警告: 数据中没有找到'市盈率-动态'列")
    print(f"可用列: {hs300.columns.tolist()}")

# 5. 去除重复行
print("正在去除重复行...")
hs300 = hs300.drop_duplicates(subset=['code'])

# 6. 打印结果
print("\n市盈率大于2小于5的沪深300股票:")
if not hs300.empty:
    # 按照市盈率排序
    hs300 = hs300.sort_values(by='市盈率-动态')
    print(hs300[['code', '名称', '市盈率-动态']].to_string(index=False))
else:
    print("未找到符合条件的股票")

print("\n程序执行完毕")

 